package thread;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wx
 * Date: 2023-12-05
 * Time: 14:33
 */
//如何创建线程?
    // 1.继承Thread重写run;
class MyThraed extends  Thread {
    /* @Override
     public void run() {
         while(true){
             System.out.println("hello Thread");
         }
     }*/
    //在循环中加入sleep来降低循环的速度,java中使用的是封装后的版本,Thread提供的静态方法.
    public void run() { //为什么main的sleep可以throw,但是第一个不可以?
                        //如果加上throw会修改方法签名,此时就无法构成重写了;
                        //父类里边没有throw,子类里也不应该存在throw异常
        while (true) {
            System.out.println("hello Thread");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }
}

    public class ThreadDemo1 {
        public static void main(String[] args)  {

            //这种执行方式会使cpu占用率过高,增加cpu的电脑功耗(电脑会非常烫)
            Thread t = new MyThraed();
            t.start(); //主线程调用start方法,就立即往下执行了
                       //与此同时,系统通过线程调用的api构建出线程,并且执行run
                       //由于创建线程本身也有开销 ,第一轮打印导致 Thread 会比 main 略慢一筹(大概率现打印main的原因)
                       //main线程其实是第一线程;
            while (true) {
                System.out.println("hello main");
                try {
                    Thread.sleep(2000);//每次唤醒执行的顺序是不定的,这就可以解释抢占式执行
                                          //第一组大概率打印main;
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }


 /* //按照之前的理解,如果一个代码中,出现两个死循环,最多只能执行一个
        //但是从结果来看,两个死循环都在执行!!!这是为什么??
        //因为一个在t线程,一个在main线程,是两个独立的执行流,所以可以执行
        Thread t = new MyThraed();
        t.start();
        //调用start,创建线程之后,兵分两路
        //一路,沿着main方法继续执行 打印hello main,
        //一路沿着进入到线程的run方法 打印hello Thread.
        //独立执行,互不干扰
        //多个线程执行顺序是不确定的,
        //操作系统内核中,有一个调度器模块,这个模块的实现方式是一种类似于"随机调度"的方式
        //随机调度,在CPU上执行,让位 时机都是不确定的
        //因此随机调度也被称为"抢占式执行"(给后面的多线程安全问题埋下伏笔)
        while(true){
            System.out.println("hello main");
        } */